<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>对象</title>
  <script>
    /*
    对象属于一种复合的数据类型，在对象中可以保存多个不同数据类型的属性。
    对象的分类：
    1、内建对象
       由ES标准定义的对象，在任何的ES的实现中都可以使用
       eg：Math、stirng、Number等
    2、宿主对象
       由JS的运行环境提供的对象，目前来讲主要指浏览器的对象
       比如 BOM DOM
    3、自定义对象
       由开发人员自己创建的对象
     */
    /*                     创建对象
    使用new关键字掉用的函数，是构造函数constructor
    构造函数是专门用来创建对象的函数
    使用typeof检查一个对象时，会返回object
     */
    var obj= new Object();
    // ***************************对象字面量*************************************//
       var obj1={};
       console.log(typeof obj1);
       obj1.name="孙悟空";
    /*
    使用对象字面量，可以直接在创建对象时，指定对象中的属性
    语法：{属性名：属性值，属性名：属性值.....}
    对象字面量的属性名可以加引号也可以不加，如果使用一些特殊的名字，则必须加引号

    属性名和属性值是一组一组的名值对结构，
    名和值之间使用“：”连接,多个名值对之间使用“，”隔开
    函数也可以是对象的属性。调用函数就是调用对象的方法（method）
  */
    var obj2={
        name:"猪八戒",
        age:28,
        gender:"男",
        test:{name:"沙和尚"},
        sayname:function (){
            console.log(obj2.name);
        }
        };
    /*
          在对象中保存的值称为属性
          向对象添加属性
          语法：对象，属性名=属性值；
     */
    // 向obj中添加一个name属性
    obj.name="二次元";
    /*
         读取对象中的属性
         语法：对象.属性名
     */
    /*
         修改对象的属性值
         语法：对象.属性名=新值
     */
    /*
          删除对象的属性
          语法：delete 对象.属性名
     */
 // ***************************属性名和属性值*************************************//
    /*
    向对象中添加属性
    属性名：
        -对象的属性不强制要求遵守标识符的规范
        如果要使用特殊的属性名，不能采用 . 的方式来操作
        需要使用另一种方式：
        语法：   对象["属性名"]=属性值
        使用[]这种形式去操作属性，更加的灵活。
        在[]中可以直接传递一个变量，这样变量的值是多少就会读取那个属性
     */
    // obj["123"]=789;
    // var n="123";
    // console.log(obj["123"]);
    // console.log(obj[n]);
    /*                枚举对象的属性
    语法：
    for(var 变量 in 对象){

      }
      for....in语句，对象中有几个属性，循环体就会执行几次
      每次执行时，会将对象中的一个属性的名字赋值给变量
     */
    for (var n in obj2){
        console.log(n);
        console.log(obj2[n]); //[]可以将变量传入对象
    }
  </script>
</head>
<body>

</body>
</html>